package com.example.demo34;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Random;

public class IdGenerator {
  private static final Logger logger = LoggerFactory.getLogger(IdGenerator.class);

  public static String generate() {
    String id = "";
    try {
      String hostName = InetAddress.getLocalHost().getHostName();
      String[] tokens = hostName.split("\\.");
      if (tokens.length > 0) {
        hostName = tokens[tokens.length - 1];
      }
      char[] randomChars = new char[8];
      int count = 0;
      Random random = new Random();
      while (count < 8) {
        int randomAscii = random.nextInt(122);
        if (randomAscii >= 48 && randomAscii <= 57) {
          randomChars[count] = (char)('0' + (randomAscii - 48));
          count++;
        } else if (randomAscii >= 65 && randomAscii <= 90) {
          randomChars[count] = (char)('A' + (randomAscii - 65));
          count++;
        } else if (randomAscii >= 97 && randomAscii <= 122) {
          randomChars[count] = (char)('a' + (randomAscii - 97));
          count++;
        }
      }
      id = String.format("%s-%d-%s", hostName,
              System.currentTimeMillis(), new String(randomChars));
    } catch (UnknownHostException e) {
      logger.warn("Failed to get the host name.", e);
    }

    return id;
  }
}

/*
 * 一般性的CheckList
 * 1、目录、模块、结构 x
 * 2、思想、原则、设计 
 * 3、可读、复用、扩展、易测试
 * 
 * 功能和非拱了的CheckList
 * 1、功能、异常、日志
 * 2、性能、安全、并发、易用
 * 
 * 问题：
 * 1、面向接口编程
 * 2、扩展性不好：
 * 3、可读性不好：a.没有注释；b.存在魔数、while内部获取字符的代码冗余，可以简化
 * 4、易测试：包含时间、host、随机数等未决行为，代码可测试性不好
 * 5、异常：异常内部处理没有抛到外层
 * 6、日志：
 * 7、性能：循环存在冗余计算，可以优化
 * 8、
 */